package models

import (
	"context" // 导入上下文包
	"github.com/go-redis/redis/v8"
	"go.mongodb.org/mongo-driver/mongo"         // 导入MongoDB驱动
	"go.mongodb.org/mongo-driver/mongo/options" // 导入MongoDB选项包
	"log"                                       // 导入日志包
	"time"                                      // 导入时间包
)

var (
	Mongo = InitMongo() // 全局MongoDB连接实例，在程序启动时初始化数据库连接
	RDB   = InitRedis() // 全局Redis客户端实例，在程序启动时初始化Redis连接
)

// InitMongo 初始化MongoDB连接并返回数据库实例
func InitMongo() *mongo.Database {
	// 创建10秒超时的上下文
	ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
	defer cancel() // 函数结束时自动取消上下文，防止资源泄漏

	// 连接MongoDB数据库（无密码模式）
	client, err := mongo.Connect(ctx, options.Client().ApplyURI("mongodb://127.0.0.1:27017")) // 连接本地MongoDB服务

	// 连接MongoDB数据库 认证（备用配置，目前未启用）
	//client, err := mongo.Connect(ctx, options.Client().SetAuth(options.Credential{
	//	Username: "", // 数据库用户名
	//	Password: "", // 数据库密码
	//}).ApplyURI("mongodb://127.0.0.1:27017"))

	// 错误处理：连接失败时记录日志并返回nil
	if err != nil {
		log.Println("Connection failed:", err) // 连接失败时记录日志
		return nil
	}

	// 返回名为"im"的数据库实例
	return client.Database("im")
}

// InitRedis Redis初始化函数
func InitRedis() *redis.Client {
	// 创建并返回Redis客户端实例
	return redis.NewClient(&redis.Options{
		Addr:     "localhost:6379", // Redis服务器地址
		Password: "1234",           // 密码（空表示无密码）
		DB:       0,                // 数据库编号（使用默认数据库0）
	})
}
